#ifndef CONFIG_H_
#define CONFIG_H_

#include <cstdint>
#include <sstream>
#include <vector>
#include <string>
#include <functional>

#include "tinyXML/tinyxml.h"
#include "TinyXmlWrapper.h"
#include "Metamorphosis/Generated/Configuration.h"

namespace qyasa
{

class config: public yasa::configuration::Configuration
{
public:

    typedef std::function<void(std::string& source)> CopyFileCallback;

    config(CopyFileCallback copyFileCallback);
    virtual ~config();

    void fromXml(const std::string& xmlData);
    std::string toXml();

    yasa::configuration::ISTCategory* findCategory(const int32_t& categoryId);
    yasa::configuration::ISTItem* findItem(const int32_t& id);

    void addCategory(const yasa::configuration::ISTCategory& cat, const int32_t& parentCategoryId);
    void deleteCategory(const int32_t& categoryId);

    void addItem(const yasa::configuration::ISTItem& item, const int32_t& categoryId);
    bool deleteItem(const int32_t& itemId);

    bool pasteItem(const int32_t& itemId, const int32_t& toCategoryId, const int32_t& fromCategoryId);

private:
    void cleanupItems();
    void cleanupCategories();
    void cleanupCategory(yasa::configuration::ISTCategory& category);

    void copyFile(std::string& source);
    void copyCategory(yasa::configuration::ISTCategory& node);
    void copyItem(yasa::configuration::ISTItem& item);

    void deleteCategoryInternal(yasa::configuration::ISTCategory& parent, const int32_t& categoryId);
    void findCategoryInternal(yasa::configuration::ISTCategory& node, const int32_t& categoryId, yasa::configuration::ISTCategory** category);
    CopyFileCallback copyFileCallback;
};

}

#endif /* CONFIG_H_ */
